package com.atguigu.spzx.cloud.gateway.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * projectName: com.atguigu.spzx.cloud.gateway.filters
 *
 * @author: 顾司羽
 * description:
 */
//@Component
public class LoginFilter implements GlobalFilter, Ordered {

    //Mono
    /**
     * 过滤方法
     *     参数： ServerWebExchange exchange 【请求和响应的包装对象】, GatewayFilterChain chain 【过滤链用于放行】
     *     返回值： Mono<Void> 异步没有返回结果的方法，没有返回值的含义 【我这方法执行完毕，还有后续动作。。。】  ||  void 没有返回值
     * @param exchange  ServerWebExchange = request + response
     * @param chain 过滤器链，用于放行的！ 类似： Filter doFilter(request,response,FilterChain)
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //业务逻辑（username 参数我就放行，否则拦截）
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        String accessToken = exchange.getRequest().getHeaders().getFirst("access_token");
        //jwtUtils.parseToken

        if (ObjectUtils.isEmpty(username)){
            //exchange.getResponse().setRawStatusCode(401);
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //【拦截】（不向后面的服务转发，我们直接返回） 200
            return  exchange.getResponse().setComplete(); //请求结束。直接返回
        }
        //【放行】
        return chain.filter(exchange);
    }


    //返回值就是过滤器优先级  0 - n  0最大
    @Override
    public int getOrder() {
        return 0;
    }
}
